/*
 * HTML5 Sortable jQuery Plugin
 * http://farhadi.ir/projects/html5sortable
 * 
 * Copyright 2012, Ali Farhadi
 * Released under the MIT license.
 * li.sortable-placeholder {border: 1px dotted #CCC;background:#fcfcfc;height:38px;margin-bottom:10px}
 * $('.form').sortable();
 */
(function($) {
var dragging, placeholders = $();
$.fn.sortable = function(options) {
  options = options || {};
  return this.each(function() {
    if (/^enable|disable|destroy$/.test(options)) {
      var items = $(this).children($(this).data('items')).attr('draggable', options == 'enable');
      options == 'destroy' &&  items.add(this)
        .removeData('connectWith').removeData('items')
        .unbind('dragstart.h5s dragend.h5s selectstart.h5s dragover.h5s dragenter.h5s drop.h5s');
      return;
    }
    var index, items = $(this).children(options.items), connectWith = options.connectWith || false;
    var placeholder = $('<' + items[0].tagName + ' class="sortable-placeholder">');
    var handle = options.handle, isHandle;
    items.find(handle).mousedown(function() {
      isHandle = true;
    }).mouseup(function() {
      isHandle = false;
    });
    $(this).data('items', options.items)
    placeholders = placeholders.add(placeholder);
    if (connectWith) {
      $(connectWith).add(this).data('connectWith', connectWith);
    }
    items.attr('draggable', 'true').bind('dragstart.h5s', function(e) {
      if (handle && !isHandle) {
        return false;
      }
      isHandle = false;
      var dt = e.originalEvent.dataTransfer;
      dt.effectAllowed = 'move';
      dt.setData('Text', 'dummy');
      dragging = $(this).addClass('sortable-dragging');
      index = dragging.index();
    }).bind('dragend.h5s', function() {
      dragging.removeClass('sortable-dragging').fadeIn();
      placeholders.detach();
      if (index != dragging.index()) {
        items.parent().trigger('sortupdate');
      }
      dragging = null;
    }).not('a[href], img').bind('selectstart.h5s', function() {
      this.dragDrop && this.dragDrop();
      return false;
    }).end().add([this, placeholder]).bind('dragover.h5s dragenter.h5s drop.h5s', function(e) {
      if (!items.is(dragging) && connectWith !== $(dragging).parent().data('connectWith')) {
        return true;
      }
      if (e.type == 'drop') {
        e.stopPropagation();
        placeholders.filter(':visible').after(dragging);
        return false;
      }
      e.preventDefault();
      e.originalEvent.dataTransfer.dropEffect = 'move';
      if (items.is(this)) {
        dragging.hide();
        $(this)[placeholder.index() < $(this).index() ? 'after' : 'before'](placeholder);
        placeholders.not(placeholder).detach();
      }
      return false;
    });
  });
};
})(jQuery);
